#include <iostream>
#include <vector>
#include <unistd.h>
#include <string>
#include <functional>
#include <pthread.h>
#include <ctime>
#include <cstring>
#include <signal.h>
#include <cstdlib>
using namespace std;

typedef function<void()> task;

// struct ThreadData {
//     // 构造函数

//     ThreadData(const string& threadname, const uint64_t createtime, task func) 
//         :_threadname(threadname)
//         ,_createtime(createtime)
//         ,_task(func)
//     {}
//     string _threadname;
//     uint64_t _createtime;
//     task _task;
// };

// void fac() {
//     cout << "我是新线程大任务的一部分……" << endl;
// }



// void *func(void* args) {
//     ThreadData *td = static_cast<ThreadData*>(args);
//     while (true) {
//         cout << "I am a new thread: " << td->_threadname << ", createtime is " << td->_createtime << endl;
//         td->_task();
//         sleep(1);
//     }
//     return nullptr;
// }

// 转化八进制
string ToHex(pthread_t tid) {
    char id[64];
    snprintf(id, sizeof(id), "0x%lx", tid);
    return id;
}

// void* func(void *args) {
//     while (true) {
//         cout << "I am a new thread: " << (const char*)args << ", my thread id is: " << ToHex(pthread_self()) << endl;
//         char *threadname = (char*)args;
//         if (strcmp(threadname, "thread-3") == 0) {
//             int a = 10;
//             a /= 0;
//         }
//         sleep(1);
//     }
//     return nullptr;
// }


// int main() {
//     vector<pthread_t> ids;
//     // 创建多线程，获取线程id
//     for (int i = 1; i <= 5; i++) {
//         pthread_t tid;
//         char thread_name[64];
//         snprintf(thread_name, sizeof(thread_name), "%s-%d", "thread", i);
//         pthread_create(&tid, nullptr, func, thread_name);
//         ids.push_back(tid);
//         sleep(1);
//     }

//     for (auto id : ids) {
//         cout << id << " ";
//     }
//     cout << endl;
//     while (true) {
//         cout << "I am main thread: my thread id is: " << ToHex(pthread_self()) << endl;
//         sleep(1);
//     }

//     return 0;
// }

// struct ThreadExit {
//     // 构造函数
//     ThreadExit(const string thread_name, const uint64_t exit_time, const int exit_code) 
//         :_thread_name(thread_name)
//         ,_exit_time(exit_time)
//         ,_exit_code(exit_code)
//     {}

//     string _thread_name;
//     uint64_t _exit_time;
//     int _exit_code;
// };

// void* func(void* args) {
//     int cnt = 5;
//     while (cnt--) {
//         cout << "I am a new thread" << endl;
//         sleep(1);
//     }
//     const string threadname = "thread-1";
//     ThreadExit* Te = new ThreadExit(threadname, (const uint64_t)(time(nullptr)), 10);
//     return (void*)Te;
// }

// int main() {
//     // 获取线程的返回值
//     pthread_t tid;
//     pthread_create(&tid, nullptr, func, (void*)"thread-1");

//     cout << "I am main thread, my thread id is: " << pthread_self() << endl;
//     sleep(8);
//     ThreadExit* te = nullptr;
//     int n = pthread_join(tid, (void**)&te);
//     cout << "new thread is exit done, thread name is: " << te->_thread_name << ", exit time is: " << te->_exit_time << ", exit code is " << te->_exit_code << endl;
 
    
//     return 0;
// }

void* func(void* args) {
    const char* threadname = (const char*)args;
    
    while (true) {
        cout << "I am a new thread my thread name is: " << threadname << ", my thread id is " << ToHex(pthread_self()) << endl;
        cout << endl;
        sleep(1);
    }
    return (void*)"thread-1 done";
}

int main() {
    // 线程的分离与取消
    pthread_t tid;
    pthread_create(&tid, nullptr, func, (void*)"thread-1");

    int cnt = 3;
    while (cnt--) {
        cout << "I am main thread, my thread id is: " << ToHex(pthread_self()) << endl;
        cout << endl;
        sleep(1);
    }
    // 线程的取消
    pthread_detach(tid);
    // 线程分离后也是可以取消的
    pthread_cancel(tid);

    // 线程分离之后，就不能再join了
    char* ret = nullptr;
    int n = pthread_join(tid, (void**)&ret); // 线程取消后还是可以join的，但是线程分离后就不能join了
    cout << endl;
    cout << "new thread done, pthread_join return val is: " << n << "new thread return val is: " << ret << endl;
    return 0;
}















// void *func(void *args) {
//     int cnt = 5;
//     while (cnt--) {
//         cout << "I am a new thread" << endl;
//         sleep(1);
//     }
//     // return nullptr; // 第一种方式——直接在线程return
//     // exit(-1); // 第二种方式——直接使用exit，但是这样会使整个进程退出
//     pthread_exit(nullptr); // 第三种方式——使用系统调用pthread_exit

// }

// int main() {
//     // 线程的终止方式

//     // 创建新线程
//     pthread_t tid;
//     pthread_create(&tid, nullptr, func, nullptr);

//     // 主线程
//     while (true) {
//         cout << "I am main thread" << endl;
//         sleep(1);
//     }
//     return 0;
// }

















// int main() {
//     // 线程的创建和线程的传参
//     pthread_t tid;
//     const string tname = "thread-1";
//     ThreadData* td = new ThreadData(tname, (uint64_t)time(nullptr), fac);
//     pthread_create(&tid, nullptr, func, td);

//     while (true) {
//         cout << "I am main thread" << "my pid is: " << getpid() <<  endl;
//         sleep(1);
//     }

//     return 0;
// }

